package modelo.servicio;

import java.util.List;
import modelo.bd.dao.ResponsableDAO;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Responsable;

public class Responsables {

    private static Responsables instancia;
    private ResponsableDAO dao;

    private Responsables() {
        this.dao = new ResponsableDAO();
    }

    public static Responsables instancia() {
        if (instancia == null) {
            instancia = new Responsables();
        }
        return instancia;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("No se puede clonar Responsables.");
    }

    public void agregar(String claveFlujo, String clavePaso, boolean forsozo,
            String claveRes, boolean aprobador, boolean recibeCopia, String usuario) throws DAOException {
        Responsable responsable = new Responsable(forsozo, aprobador, recibeCopia, claveRes);
        if (forsozo) {
            responsable.setAprobador(true);
        }
        responsable.setPaso(Pasos.instancia().porClave(claveFlujo, clavePaso));
        dao.add(responsable, usuario);
    }

    public void editar(String claveFlujo, String clavePaso, boolean forsozo,
            String claveRes, boolean aprobador, boolean recibeCopia, String usuario) throws DAOException {
        Responsable responsable = new Responsable(forsozo, aprobador, recibeCopia, claveRes);
        if (forsozo) {
            responsable.setAprobador(true);
        }
        responsable.setPaso(Pasos.instancia().porClave(claveFlujo, clavePaso));
        dao.update(responsable, usuario);
    }

    public void eliminar(String claveFlujo, String clavePaso, String claveRes, String usuario) throws DAOException {
        dao.deleteWhere("repf_fluj_clave = '" + claveFlujo.replace("'", "''") + "' \n"
                + "AND    repf_pafl_clave = '" + clavePaso.replace("'", "''") + "' \n"
                + "AND    repf_uspe_clave = '" + claveRes.replace("'", "''") + "'");
        modelo.dominio.Flujo f = Flujos.instancia().porClave(claveFlujo);
        Flujos.instancia().editar(f.getClave(), f.getDescripcion(),
                f.getDescripcionCorta(), "N", f.getComentarios(), f.isValidaMonto(), usuario);
    }

    public List<Responsable> todos() throws DAOException {
        return dao.selectAll();
    }

    public List<Responsable> delPaso(String claveFlujo, String clavePaso) throws DAOException {
        return dao.selectWhere("repf_pafl_clave = '" + clavePaso.replace("'", "''") + "' \n"
                + "AND repf_fluj_clave = '" + claveFlujo.replace("'", "''") + "'");
    }

    public Responsable porClave(String claveFlujo, String clavePaso, String claveRes) throws DAOException {
        try {
            List<Responsable> ls = dao.selectWhere("repf_uspe_clave = '" + claveRes + "' \n"
                    + "AND repf_pafl_clave = '" + clavePaso.replace("'", "''") + "' \n"
                    + "AND repf_fluj_clave  = '" + claveFlujo.replace("'", "''") + "'");
            return ls.get(0);
        } catch (Exception e) {
            return null;
        }
    }
}
